package ThreadDemo;

import java.io.FilterOutputStream;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class ThreadDemo1 {
    public static void main(String[] args) throws Exception {
        //此处<>是返回类型,包装类
        Callable<Integer> callable = new Callable<Integer>() {
            //callable中会提供一个call方法,此时我们发现call方法的返回值是Integer
            @Override
            public Integer call() throws Exception {
                int result = 0;
                for (int i = 0; i < 1000; i++) {
                    result += i;
                }
                return result;
            }
        };
        //Thread没有提供构造函数来传入callable,通过FutureTask类来粘合Thread与callable类
        //FutureTask未来的任务,既然这个任务是在未来执行完毕,那我们去取结果的时候需要一个凭据,而FutureTask就是这个凭据
        FutureTask<Integer> futureTask = new FutureTask<>(callable);
        Thread t = new Thread(futureTask);
        //此时我们这种多线程的代码是有返回值的,所以不涉及到变量捕获,匿名内部类等问题
        //代码编写效率提高.
        t.start();
        //这个代码也不需要join,直接用FutureTask来打印结果 FutureTask.get()也是有阻塞功能的
        //如果线程没有结束就会阻塞,直到线程执行完毕.
        System.out.println(futureTask.get());
    }
}
